package br.com.usjt.sge.usuario;

import java.util.List;

import org.apache.log4j.Logger;
import org.hibernate.Query;
import org.hibernate.Session;

/**
 * Classe concreta(implementacao) de UsuarioDAO.
 * @author cicero
 *
 */
public class UsuarioDAOHibernate implements UsuarioDAO {
	
	private static final Logger logger = Logger.getLogger(UsuarioDAOHibernate.class.getName());
	private Session session;
	

	public void setSession(Session session) {

		this.session = session;

	}

	public void salvar(Usuario usuario) {

		try {
			
			this.session.save(usuario);
			logger.info("Usuario salvo na base de dados.");

		} catch (Exception e) {

			logger.error("Erro ao salvar o usuario - " + e.getMessage());
			throw new ExceptionInInitializerError();

		} 

	}

	public void atualizar(Usuario usuario) {
						
		if (usuario.getPermissao() == null || usuario.getPermissao().size() == 0) {
			
			Usuario usuarioPermissao = this.carregar(usuario.getCodigo());
			usuario.setPermissao(usuarioPermissao.getPermissao());
			this.session.evict(usuarioPermissao);
			
		}
		
		this.session.update(usuario);
		logger.info("Usuario alterado na base de dados.");
				
	}

	public void excluir(Usuario usuario) {
		
		this.session.delete(usuario);
		logger.info("Usuario deletado na base de dados.");

	}

	public Usuario carregar(Integer codigo) {
		
		return (Usuario) this.session.get(Usuario.class, codigo);
				
	}

	public Usuario buscarPorEmail(String email) {
		
		String hql = "select u from Usuario u where u.email = :email";
		Query consulta = this.session.createQuery(hql);
		consulta.setString("email", email);
		
		return (Usuario) consulta.uniqueResult();
	}
	
	@SuppressWarnings("unchecked")
	public List<Usuario> listar() {
					
		return this.session.createCriteria(Usuario.class).list();
	}

}
